home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_081 / CBHD501 / DOC / SCSIDRV2.U < prev   
Text File  |  1998-03-14  |  14KB  |  422 lines

  1.  
  2. Konzept für Systemglobale SCSI-Routinen.                                        © S. Engel 1994-1995
  3.  
  4. Teil 2 : Target-Handling
  5.  
  6. #
  7. # $Source: F:\KLEISTER.II\CBHD\RCS\scsidrv2.doc,v $
  8. #
  9. # $Revision: 1.1 $
  10. #
  11. # $Author: S_Engel $
  12. #
  13. # $Date: 1995/02/05 10:40:36 $
  14. #
  15. # $State: Exp $
  16. #
  17. #****************************************************************************
  18. # History:
  19. #
  20. # $Log: scsidrv2.doc,v $
  21. # Revision 1.1    1995/02/05    10:40:36    S_Engel
  22. # Initial revision
  23. #
  24. #
  25. #
  26. #
  27.  
  28.  
  29. STRUKTUREN
  30.  
  31.     Typen für Target-Routinen:
  32.  
  33.              tReqData =
  34.                         RECORD
  35.                             ErrCode         : BYTE;                 (* Standard auf $70                                 *)
  36.                             SegNo             : BYTE;
  37.                             SenseKey        : BYTE;
  38.                             InfoByte1     : BYTE;                 (* ODD ADDRESS!!!                                     *)
  39.                             InfoByte2     : BYTE;
  40.                             InfoByte3     : BYTE;
  41.                             InfoByte4     : BYTE;
  42.                             AddLen            : BYTE;                 (* Standard auf $0A : 18 Bytes Daten *)
  43.                             Reserved        : LONGCARD;
  44.                             CmdSpec         : LONGCARD;         (* Cmd-Specific Info                                *)
  45.                             AddSense        : BYTE;
  46.                             AddSenseQual: BYTE;
  47.                             FieldRepl     : BYTE;
  48.                             SKeySpec0     : BYTE;
  49.                             SKeySpec1     : BYTE;
  50.                             SKeySpec2     : BYTE;
  51.                         END;
  52.     
  53.              tpCmd                        = POINTER TO ARRAY[0..11] OF BYTE;
  54.              tpTargetHandler    = POINTER TO tTargetHandler;
  55.              tTargetHandler     =
  56.                         RECORD
  57.                             next                : tpTargetHandler;
  58.                             TSel                : PROCEDURE ((* CSB *) SHORTCARD,
  59.                                                                              (* CSD *) SHORTCARD) : BOOLEAN;
  60.                             TCmd                : PROCEDURE ((* Cmd *) tpCmd) : BOOLEAN;
  61.                             TCmdLen         : PROCEDURE ((* Cmd *) SHORTCARD) : SHORTCARD;
  62. *****
  63. Bei den drei Routinen könnte ich mich auf Registerübergabe einlassen, damit
  64. man etwas schneller ist, aber da hat man dann ja sofort die Basis für
  65. Nicht-Reentranz.
  66. tSel muß für andere Busse als NCR5380 evtl anders gelöst werden, eigentlich
  67. sollten aktueller Bus-Status und aktueller Busdateninhalt aber reichen,
  68. höchstens den Busdateninhalt auf 32 Bit anheben (32-Bit-SCSI)
  69. *****
  70.  
  71.                             TReset            : PROCEDURE;
  72.                             TEOP                : PROCEDURE;
  73.                             TPErr             : PROCEDURE;
  74.                             TPMism            : PROCEDURE;
  75.                             TBLoss            : PROCEDURE;
  76.                             TUnknownInt : PROCEDURE;
  77.                         END;
  78.     
  79. FUNKTIONEN
  80.  
  81.     Jede Routine in tTargetHandler kann einen Nullzeiger enthalten, was bedeutet, 
  82.     daß der Handler sich für die Funktion nicht interessiert.
  83.  
  84.     Per Install wird ein Handler eingetragen.
  85.     Die Installationsroutine verkettet den Handler über next und merkt
  86.     sich den ersten Eintrag der Tabelle.
  87.     Wenn noch keine Handler installiert sind, werden die Interrupts
  88.     geschärft.
  89.     Grundsätzlich werden später installierte Handler eher gerufen, also
  90.     kann ein später installierender Handler die Kommandos einem vorher
  91.     installierten Handler wegschnappen.
  92.  
  93.     Bei Deinstall wird ein Handler ausgekettet. Ist kein Handler
  94.     mehr übrig, werden die Interrupts entschärft.
  95.  
  96.     NICHT VERGESSEN!!
  97.  
  98.     Alle Routinen laufen im Interrupt ab -> keine Systemaufrufe!!!
  99.     TT            : Interrupt vom TT-MFP
  100.     Falcon    : Interrupt vom ST-MFP
  101.  
  102.  
  103.     Bei der ganzen Sache gibt es ein Problem:
  104.     Festplattentreiber löschen im allgemeinen das select enable register
  105.     bei SCSI-Zugriffen, und somit ist daraufhin der Handler für Kommandos
  106.     inaktiv.
  107.  
  108.     Bekannte Verhalten von Plattentreibern:
  109.  
  110.     CBHD         : löscht (in bisherigen Releases von Claus Brod)
  111.     AHDI         : löscht
  112.     HUSHI      : löscht
  113.     HDDRIVER : löscht anscheinend nicht
  114.  
  115.     next    : Nächster Handler in der Tabelle
  116.                     Wird vom Treiber benutzt (Finger wech)
  117.  
  118.     TSel    : Selektion aufgetreten
  119.                     Interessant zB für reselection
  120.                     CSD ist der aktuelle Inhalt des SCSI-Busses, maskiert mit der
  121.                     eigenen ID -> das Bit der ID des Rufers ist gesetzt.
  122.                     Damit kann kontrolliert werden, ob es überhaupt das Gerät ist,
  123.                     auf das gewartet wird.
  124.  
  125.                     CSB ist der aktuelle SCSI-Busstatus:
  126.  
  127.                     Bit 15     Reserved         (EDMA)
  128.                     Bit 14     Reserved         (DRQ)
  129.                     Bit 13     Reserved         (SPER)
  130.                     Bit 12     Reserved         (INT)
  131.                     Bit 11     Reserved         (PHSM)
  132.                     Bit 10     Reserved         (BSY)
  133.                     Bit 09     /ATN
  134.                     Bit 08     /ACK
  135.                     Bit 07     /RST
  136.                     Bit 06     /BSY
  137.                     Bit 05     /REQ
  138.                     Bit 04     /MSG
  139.                     Bit 03     /C/D
  140.                     Bit 02     /I/O
  141.                     Bit 01     /SEL
  142.                     Bit 00     /DBP
  143.  
  144.                     Man sollte dabei beachten, daß eine Übernahme der Selektion
  145.                     allen anderen in der Handlerkette liegenden Handlern
  146.                     keine Chance läßt, an der aktuellen Operation teilzunehmen.
  147.                     Wer auf eine Reselection wartet, sollte nur diese annehmen
  148.                     (Reselection: /I/O gesetzt)
  149.  
  150.     !!!!        Nur was macht man, wenn zwei Prozesse auf eine Reselection
  151.     !!!!        vom gleichen Gerät warten??
  152.  
  153.                     RETURN TRUE  : Zustand angenommen und behandelt
  154.                     RETURN FALSE : interessiert mich nicht
  155.  
  156.     TCmd    : Bekommt ein empfangenes Kommando angeboten
  157.                     RETURN FALSE : Nicht an dem Kommando interessiert
  158.                     RETURN TRUE  : Kommando verarbeitet
  159.  
  160.                     Wenn die Routine das Kommando verarbeitet, muß sie selbst
  161.                     SendData, GetData, SendStatus und SendMsg abarbeiten
  162.                     und dann auch TRUE melden.
  163.  
  164.     TCmdLen: Ein Kommando ist angekommen, dessen Kommandolänge nicht
  165.                     bekannt ist.
  166.                     RETURN : 0 : Dieses Kommando interessiert den Handler nicht
  167.                                      x : Dieses Kommando soll mit x Bytes empfangen
  168.                                              werden.
  169.  
  170.                     Vom Kern werden selbsttätig berücksichtigt:
  171.  
  172.                     Gruppe 0 : 6-Byte-Kommando
  173.                     Gruppe 1 : 10-Byte-Kommando
  174.                     Gruppe 2 : 10-Byte-Kommando
  175.                     Gruppe 5 : 12-Byte-Kommando
  176.  
  177.                     bei allen anderen Gruppen wird nachgefragt (z. Zt. nicht)
  178.  
  179.                     Gibt niemand eine Antwort, wird folgende Annahme getroffen:
  180.  
  181.                     Gruppe 3 : 10-Byte-Kommando     Gruppe ist Reserved!
  182.                     Gruppe 4 : 10-Byte-Kommando     Gruppe ist Reserved!
  183.                     Gruppe 6 : 12-Byte-Kommando     Gruppe ist vendor specific
  184.                     Gruppe 7 : 12-Byte-Kommando     Gruppe ist vendor specific
  185.  
  186.                     ACHTUNG!!!
  187.                     Wer die Kommandolänge angibt, MUSS auch das Kommando benutzen
  188.                     und dann TCmd bedienen!
  189.  
  190.                     In dem Fall, daß TCmdLen gerufen wird, während der aktive
  191.                     Handler in TSel ist, ist eh klar, daß er das Kommando
  192.                     bedient.
  193.                     Wenn TCmdLen vom internen Kommandoempfänger gerufen wird,
  194.                     wird anschließend das Kommando auch an diesen Handler per
  195.                     TCmd übergeben! (z. Zt. nicht implementiert)
  196.  
  197.  
  198.     TReset: Der SCSI-Bus hatte einen Reset
  199.                     Alle installierten Handler werden gerufen
  200.  
  201.     TEOP    : EOP aufgetreten (zur Zeit nicht benutzt)
  202.  
  203.     TPErr : Ein Parity Error ist aufgetreten (z. Zt. nicht benutzt)
  204.  
  205.     TPMism: Ein Phase Mismatch aufgetreten (z. Zt. nicht benutzt)
  206.                     Routine kann auch NIL sein
  207.  
  208.     TBLoss: BSY verloren (z. Zt. nicht benutzt)
  209.  
  210.     TUnknownInt: unbekannter Interrupt aufgetreten (z. Zt. nicht benutzt)
  211.  
  212.  
  213.  
  214. ABLAUF DER INTERRUPT-BEHANDLUNG     (ZUR ZEIT)
  215.  
  216.                 ------------------------
  217.                 |                                          |
  218.                 |      Interrupt vom         |
  219.                 |              MFP                     |
  220.                 |                                          |
  221.                 ------------------------
  222.                                      |
  223.                                      |
  224.                                      V
  225.                 ------------------------
  226.                 |                                          |
  227.                 |      Selektion?              |    Nein
  228.                 |                                          |--------->
  229.                 |                                          |
  230.                 |                                          |
  231.                 ------------------------
  232.                                      |
  233.                                      | Ja
  234.                                      V
  235.                 ------------------------
  236.                 |                                          |
  237.                 |     Interrupt-Handler  |
  238.     ----->|      über TSel rufen     |
  239.     |         |                                          |        Ja
  240.     |         |         RETURN TRUE?         |---------> Ende
  241.     |         |                                          |
  242.     |         ------------------------
  243.     |                              |
  244.     | Ja                         | Nein
  245.     |                              V
  246.     |         ------------------------
  247.     |         |                                          |
  248.     ------|  weitere Handler in  |
  249.                 |     der Kette?                 |
  250.                 |                                          |
  251.                 ------------------------
  252.                                      |
  253.                                      | Nein
  254.                                      V
  255.                 ------------------------
  256.                 |                                          |
  257.                 |  1. Kommando-Byte      |
  258.                 |  empfangen                     |
  259.                 |                                          |
  260.                 ------------------------
  261.                                      |                             ********************************************
  262.                                      |                             *                Noch nicht implementiert                    *
  263.                                      V                             *                                                                                    *
  264.                 ------------------------     *                    ------------------------                *
  265.                 |                                          |     *                    |                                          |                *
  266.                 |     Klasse 0,1,2,5?      |     *    Nein        |  Handler fragen,         |                *
  267.                 |                                          |---*--------->|  welche Kommando-      |                *
  268.                 |                                          |     *                    |  länge das Cmd hat.  |                *
  269.                 |                                          |     *            --->|                                          |------    *
  270.                 |                                          |     *            |     |  Antwort 0?                  |         |    *
  271.                 |                                          |     *            |     |                                          |         |    *
  272.                 ------------------------     *            |     ------------------------         |    *
  273.                                      |                             *            |                          |                                 |    *
  274.                                      | Ja                      *            |                          | Ja                          |    *
  275.                                      V                             *            |                          V                                 |    *
  276.                 ------------------------     *            |     ------------------------         |    *
  277.                 |                                          |     *            |     |                                          |         |    *
  278.                 |  Rest des Kommandos  |     *            |     |  weitere Handler in  |         |    *
  279.                 |  empfangen.                  |     *            ----|  der Kette?                  |         |    *
  280.                 |                                          |     *            Ja    |                                          |         |    *
  281.                 |      Klasse  Bytes         |     *                    ------------------------         |    *
  282.                 |          0             6             |     *                                         |                                 |    *
  283.                 |          1            10             |     *                                         | Nein                      |    *
  284.                 |          2            10             |     *                                         |                                 |    *
  285.                 |          5            12             |     *                                         V                                 |    *
  286.                 |                                          |     *                    ------------------------         |    *
  287.                 ------------------------     *                    |                                          |         |    *
  288.                                      |                             *                    |  Rest des Kommandos  |         |    *
  289.                                      |                             *                    |  empfangen.                  |         |    *
  290.                                      |                             *                    |                                          |         |    *
  291.                                      |                             *                    |      10 Bytes                  |         |    *
  292.                                      V                             *                    |                                          |         |    *
  293.                 ------------------------     *                    ------------------------         |    *
  294.                 |                                          |     *                                         |                                 |    *
  295.                 |     Interrupt-Handler  |     *                                         |                                 |    *
  296.     ----->|      über TCmd rufen     |<--*----------------------                                 |    *
  297.     |         |                                          |     *                                                                             |    *
  298.     |         |         RETURN TRUE?         |---*--------->Ende                                                 |    *
  299.     |         |                                          |     *     Ja                                                                  |    *
  300.     |         ------------------------     *                                                                             |    *
  301.     |                              |                             *                    ------------------------         |    *
  302.     |                              |                             *                    |                                          |<-----    *
  303.     | Ja                         | Nein                  *                    |  Rest des Kommandos  |                *
  304.     |                              |                             *                    |  empfangen.                  |                *
  305.     |                              |                             *                    |                                          |                *
  306.     |                              V                             *                    |  Kommando über TCmd  |                *
  307.     |         ------------------------     *                    |  von dem Handler         |                *
  308.     |         |                                          |     *                    |  abarbeiten lassen     |                *
  309.     ------|  weitere Handler in  |     *                    |                                          |                *
  310.                 |     der Kette?                 |     *                    ------------------------                *
  311.                 |                                          |     *                                         |                                        *
  312.                 ------------------------     *                                         |                                        *
  313.                                      |                             *                                         V                                        *
  314.                                      | Nein                  *                                     Ende                                     *
  315.                                      V                             *                                                                                    *
  316.                 ------------------------     ********************************************
  317.                 |                                          |
  318.                 |  REQUEST SENSE?          |
  319.                 |                                          |
  320.                 |                                          |
  321.                 ------------------------
  322.                                      |
  323.                                      | Nein
  324.                                      V
  325.                 ------------------------        
  326.                 |                                          |        
  327.                 | Setze Sense Data auf |        
  328.                 | ILLEGAL REQUEST und  | 
  329.                 | INVALID COMMAND          | 
  330.                 | OPERATION CODE             | 
  331.                 |                                          |        
  332.                 | Sende Check Condition|        
  333.                 | und Msg Cmdcomplete  |
  334.                 |                                          |
  335.                 ------------------------
  336.                                      |
  337.                                      |
  338.                                      V
  339.                                  Ende
  340.  
  341.  
  342. STANDARDFUNKTIONEN
  343.  
  344.     Als Targethandler sollten unbedingt die folgenden Funktionen installiert 
  345.     werden (mandatory für Processordevices):
  346.  
  347.     TEST UNIT READY (00H)
  348.  
  349.     REQUEST SENSE (03H)
  350.     (* liefert die Daten aus ReqData *)
  351.  
  352.     SEND (0AH)
  353.  
  354.     INQUIRY (12H)
  355.  
  356.     SEND DIAGNOSTIC (1DH)
  357.  
  358.     REQUEST SENSE kann dabei den globalen Sense-Block übertragen, in den auch alle 
  359.     Routinen Ihre Fehler eintragen können (dran denken: wer eigene Fehlermeldungen 
  360.     in den Sense-Daten zusammenstellt, sollte auch die Sense-Daten vorher 
  361.     vorlöschen, damit keine Altlasten darin liegen)
  362.  
  363. DERZEITIGE REALISIERUNG
  364.  
  365.     CBHD bedient die Mandatories und antwortet auf Request Sense mit den globalen 
  366.     Request Sense Daten.
  367.  
  368.     Inquiry meldet Processor Device, ANSI 2, ATARI, TT030/Falcon030.
  369.  
  370.     Ein SCSI-Monitor zum rumspielen existiert auch.
  371.  
  372. TODO
  373.  
  374.     -Bedienung von BSY loss
  375.     -Bedienung von EOP
  376.     -Bedienung von Phase Mismatch
  377.     -Bedienung von UnknownInt (landet bei TReset)
  378.     -Übergabe eines Kommandos an den Beantworter von TCmdLen, wenn das
  379.      Kommando selbsttätig von der Interruptroutine empfangen wurde.
  380.     -Wenn man selbst als Initiator auftritt, und die ersten Schritte zum Absetzen 
  381.      des Kommandos vorbereitet sind, und dann eine Selektion als Target auftritt, 
  382.      werden die Ports von den Target-Routinen umprogrammiert. 
  383.      Danach kann man wohl kaum an der unterbrochenen Stelle wieder aufsetzen.
  384.      Muß in Ordnung gebracht werden!! 
  385.  
  386.  
  387. ANWENDUNGEN
  388.  
  389.     Für Anwendungen läßt sich einiges sehen. Zum einen ist ein SCSI-Monitor 
  390.     möglich, mit dem man sehen kann, was ein zu untersuchendes Programm an 
  391.     SCSI-Calls absetzt. Ein sehr interessantes Zeil ist auch ein Netzwerktreiber, 
  392.     der über SCSI arbeitet.
  393.  
  394.  
  395. PROBLEME
  396.  
  397.     Während Transfers müssen die Interrupts maskiert werden, da sonst ein
  398.     Transfer durch den Handler unterbrochen wird. Es wäre interessant, wenn ein 
  399.     Treiber auch die Interrupts zum Schlafenlegen benutzt.
  400.  
  401.     Falcon: Zugriffe auf die Floppy führen zum Interrupt, da der SCSI-Interrupt 
  402.                     auf dem DMA-Interrupt liegt. :-(((
  403.                     Mal sehen, was man da machen kann.
  404.  
  405.     Wenn die Target-Routinen aktiv sind, bekommen Programme mit onboard-SCSI evtl. 
  406.     Probleme, da die DMA-Transfers über den PhaseMismatch an den Interrupt-Handler 
  407.     geliefert werden.
  408.  
  409. OFFENE FRAGEN
  410.  
  411.     -Wann und in welcher Form sollten EOP, Parity Error, Phase Mismatch
  412.      und BSY loss überhaupt verwendet werden?
  413.     -EOP, Parity Error, PhaseMismatch, BSY loss nur an den in Aktion
  414.      befindlichen Handler? Halte ich für Sinnvoll, was sollen die anderen
  415.      damit?
  416.      Wie kann man diese Interrupts überhaupt bekommen, während man Transfers 
  417.      macht???
  418.     -Was hängt man in TUnknownInt?
  419.         1. Interrupt bei BSR.INT = 0
  420.         2. ?
  421.                 
  422.